package com.atguigu.gulimall.order.config;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * @Description :解决feign远程调用丢失请求头问题
 * 根据源码可以得出：为什么远程调用会丢失请求头
 *  由于在远程调用的时候，feign创建新的请求，请求头数据都在老的请求中（即本服务中）
 *  所以远程调用的时候并没有把数据带到被远程调用的服务中。
 *  解决办法：通过拦截器把老请求的请求添加到feign中。
 * @Author : mayp
 * @Date: 2020-12-30 11:24
 */
@Configuration
public class GuliFeignConfig {

    /**
     *解决feign远程调用丢失请求头问题
     * @return
     */
    @Bean("requestInterceptor")
    public RequestInterceptor requestInterceptor(){
        return new RequestInterceptor(){
            @Override
            public void apply(RequestTemplate requestTemplate) {
//                RequestContextHolder可以获取到刚进来的这个请求数据，也就是调用我们controller下的请求方法当时的一些请求头信息
                ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                if (attributes != null){
//                    获取当前请求的对象，也即老请求
                    HttpServletRequest request = attributes.getRequest();
                    if (request != null){
//                        把获取到的请求对象的头信息都同步进来，主要同步cookie
                        String cookie = request.getHeader("Cookie");
                        requestTemplate.header("Cookie", cookie); // 老请求头数据设置进新请求头中
                        System.out.println("feign远程之前先进行RequestInterceptor.apply()");
                    }
                }
            }
        };
    }
}
